const http = require("http")
const fs = require("fs")
const qs = require("querystring");

http.createServer((req,res)=>{
    if(req.url.includes("/api")){
        console.log("api")
        dataRequire(req,res);

    }else if(req.url.includes("/aaaa")){
        console.log("aaaa")
        jsonpRequire(req,res);
    }else{
        console.log("文件流")
        fileRequire(req,res);
    }
}).listen(3000,()=>{
    console.log("服务器开启成功，地址为：http://localhost:3000")
})

function jsonpRequire(req,res){
    const jsonpObj = qs.parse(req.url.split("?")[1]);
    res.write(jsonpObj.callback + '("这是后端给你的数据")');
    res.end();
}
//数据请求
function dataRequire(req,res){
    //在整理数据请求的数据
    let str = "";
    req.on("data",(chunk)=>{
        str += chunk;
    })
    req.on("end",()=>{
        let data;
        if(str){
            // 非地址栏数据
            data = qs.parse(str);
        }else{
            // 地址栏数据
            const urlObj = new URL("http://localhost:3000" + req.url);
            data = qs.parse(urlObj.search.slice(1));
        }
        // 解析到的前端的数据
        // console.log(data);
        // res.write("hello world987987987");
        // 解析数据之后，进行二次路由处理
        // 根据数据内，携带的特殊标志，决定真实要执行的后端功能
        // 假设，数据内有type属性，可能的值有：login，register，getGoods...
        switch(data.type){
            case "login":
                console.log("login")
                login(req,res,data);break;
            case "register":
                console.log("register")
                register(req,res,data);break;
            case "getGoods":
                console.log("getGoods");
                getGoods(req,res);break;
        }
        // res.end();
    })
}

function login(req,res,data){
    console.log("登录功能")
    const obj = {
        name:data.name,
        password:data.password
    }

    select(data=>{
        let srt = JSON.parse(data)
        console.log(srt.length)
        let objj = {};
        for(let i =0;i<srt.length;i++){
            console.log(srt[i].name)
            if(srt[i].name == obj.name){
                if(srt[i].password == obj.password){
                    objj = {
                        code:1,
                        title:"登录成功",
                        data:{
                            name:obj.name,
                        }
                    }
                    break;
                }else{
                    objj = {
                        code:0,
                        title:"登录失败",
                    }
                   
                }
            }else{
                objj = {
                    code:0,
                    title:"登录失败",
                }
            }
        }
        res.write(JSON.stringify(objj))
        res.end();
    })



}
function register(req,res,data){
    console.log("注册功能")
    
    // console.log(data);
    // 处理前端发送过来的数据
    const obj = {
        name:data.name,
        password:data.password
    }
    console.log(obj);
    // 添加到数据库
    insert(obj,()=>{
        // 添加成功之后，重新读取最新数据
        select(data=>{
            // 查询成功，处理数据，发送给前端
            // console.log(JSON.parse(data)[JSON.parse(data).length-1].name)
            const obj = {
                code:1,
                title:"插入成功",
                // data: JSON.parse(data)
                data:{
                    name:JSON.parse(data)[JSON.parse(data).length-1].name,
                    password:JSON.parse(data)[JSON.parse(data).length-1].password,
                }
            }
            res.write(JSON.stringify(obj))
            res.end();
        })
    },(err)=>{
        // 添加失败，处理数据，发送给前端
        const obj = {
            code:0,
            title:"添加失败",
            data:err
        }
        res.write(JSON.stringify(obj))
        res.end();
    })
}


function getGoods(req,res){
    console.log("获取商品信息")
    fs.readFile("./www/data/goods.json", (err,data)=>{
        // console.log(data);
        if(err){
            res.write("404");
        }else{
            res.write(data);
        }
        res.end();
        // res.write(data);
        // res.end();
    })
}
// ...


function fileRequire(req,res){
    // 处理前端请求的地址，防止get数据，干扰文件查找
    fs.readFile("./www" + req.url.split("?")[0], (err,data)=>{
        if(err){
            res.write("404");
        }else{
            // console.log(data);
            res.write(data);
        }
        res.end();
    })
}



// ---------------

// 封装数据库的查询功能
function select(success, error){
    // 读取文件
    fs.readFile("./www/data/login.json","utf-8",(err,data)=>{
        // 读取结束后，执行成功或失败的回调函数
        if(err){
            error(err);
        }else{
            success(data);
        }
    })
}

// 封装的数据库的插入数据的功能
function insert(obj, a, b){

    fs.readFile("./www/data/login.json","utf-8",(err, data)=>{
        if(err){
            console.log("insert-err")
            b("读取失败")
        }else{
            console.log("insert-data")

            let flag = !JSON.parse(data).some(val=>{
                return val.name == obj.name;
            })
            if(flag){
                const arr = data ? JSON.parse(data) : [];
                obj.id = Date.now();
                arr.push(obj);
                fs.writeFile("./www/data/login.json", JSON.stringify(arr), err=>{
                    if(err){
                        b("增加失败");
                    }else{
                        a("增加成功");
                    }
                })

            }else{
                b("帐号被人抢先注册了，请换一个吧！！");
            }
            



        }
    })
}

function update(where, msg, success, error){
    // 读取数据库
    fs.readFile("./database/msg.json","utf-8",(err, data)=>{
        if(err){
            error(err);
        }else{
            // 解析数据
            const arr = JSON.parse(data);
            // 遍历数据，查询到要修改的数据
            let i;
            for(i=0;i<arr.length;i++){
                if(arr[i].id == where.id){
                    break;
                }
            }
            // 将数据从数组中修改
            arr[i] = msg;
            // 将数组重新存回去
            fs.writeFile("./database/msg.json", JSON.stringify(arr), err=>{
                if(err){
                    error("修改失败");
                }else{
                    success("修改成功");
                }
            })
        }
    })
}
